home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games: Greatest Hits 1996 / Amiga Games: Greatest Hits 1996.iso / spiele / publicdomain / ls-tron3.1 / player.i < prev    next >
Text File  |  1996-05-01  |  32KB  |  1,135 lines

  1. { Player.i }
  2.  
  3. {$I "Joystick.i" }
  4.  
  5. { Funktionen :
  6.    - BitTest (Bit gesetzt oder nicht? )
  7.    - Joystick1 ( Joystickport )
  8.    - Joystick2 ( Mausport     )
  9.  
  10.       Rückgabewerte :
  11.  
  12.         0 - nichts
  13.         1 - oben
  14.         2 - unten
  15.         4 - links
  16.         8 - rechts
  17.        16 - Feuer
  18. }
  19.  
  20. PROCEDURE Warte; { Nach Ende des Spiels warten }
  21.  
  22.   VAR IntMSG : IntuiMessagePtr;
  23.  
  24.   BEGIN
  25.     Delay(50);
  26.     REPEAT
  27.       IntMSG:=ADDRESS(WaitPort(GameWindow^.UserPort));
  28.       IntMSG:=ADDRESS(GetMSG(GameWindow^.UserPort));
  29.       IF intMSG<>NIL THEN ReplyMSG(ADDRESS(IntMSG));
  30.     UNTIL  (IntMSG^.Class=Mousebuttons_f) OR
  31.           ((IntMSG^.Class=RawKey_F      ) AND
  32.            (IntMSG^.Code=F10            ));
  33.   END;
  34.  
  35. PROCEDURE WaitEsc(ID : BYTE); { Warten, falls jemand entkommen ist. }
  36.  
  37.   VAR IntMSG       : IntuiMessagePtr;
  38.       SpielerNr    : STRING;
  39.       Zahl,cosinus : SHORT;
  40.       Q,Time       : BOOLEAN;
  41.       x,MinX,MaxX  : SHORT;
  42.  
  43.   BEGIN
  44.     spielerNr:=ALLOCSTRING(40);
  45.  
  46.     IF Sprache=Deutsch THEN StrCpy(SpielerNr,"Entkommen : ")
  47.                        ELSE strCpy(SpielerNr,"Escaped : "  );
  48.     StrCat(spielerNr,TBase^.players[id].name);
  49.  
  50.     x:=160-(LENGTH(SpielerNr) DIV 2);
  51.     MinX:=x-2;
  52.     MaxX:=320-X;
  53.  
  54.     cosinus:=ROUND(COS(zahl/40*pi)*20);
  55.  
  56.     zahl:=20;
  57.     Q:=FALSE;
  58.     time:=FALSE;
  59.  
  60.     REPEAT
  61.       Delay(1);
  62.  
  63.       SetAPen(GameRP,9);
  64.       RectFill(GameRP,MinX,38+cosinus,MaxX,48+cosinus);
  65.  
  66.       cosinus:=ROUND(COS(zahl/40*pi)*20);
  67.  
  68.       SetAPen(GameRP,8);
  69.       RectFill(GameRP,MinX,38+cosinus,MaxX,48+cosinus);
  70.       DrawSBox(GameRP,MinX,38+cosinus,MaxX,48+cosinus);
  71.  
  72.       Print(GameRP,x,46+cosinus,spielerNr,id+1);
  73.  
  74.       inc(Zahl);
  75.       IF zahl=60 THEN BEGIN
  76.                         zahl:=0;
  77.                         Time:=TRUE;
  78.                       END;
  79.  
  80.       intMSG:=NIL;
  81.       IntMSG:=ADDRESS(GetMSG(GameWindow^.UserPort));
  82.  
  83.       IF IntMSG<>NIL THEN BEGIN
  84.                             q:= (IntMSG^.Class=Mousebuttons_f) OR
  85.                                ((IntMSG^.Class=RawKey_F      ) AND
  86.                                 (IntMSG^.Code =F10           ));
  87.                             ReplyMSG(ADDRESS(IntMSG));
  88.                           END;
  89.     UNTIL Q AND Time;
  90.     FreeString(SpielerNr);
  91.   END;
  92.  
  93. PROCEDURE Bremsen(Laenge : BYTE); { Bremsung sobald Spieler ausscheiden... }
  94.  
  95.   VAR zahl     : BYTE;
  96.       Variable : SHORT;
  97.       Test     : BYTE;
  98.  
  99.   BEGIN
  100.     IF Laenge>0 THEN
  101.        BEGIN
  102.          FOR zahl:=1 TO Laenge DO
  103.            BEGIN
  104.              FOR variable:=1 TO 110 DO Test:=1;
  105.            END;
  106.        END;
  107.   END;
  108.  
  109. PROCEDURE MyExit(Identify : BYTE); { Spieler kaputt, aber wer und wat nu }
  110.  
  111.   PROCEDURE Reichweite; { Vielleicht ist jemand zu nah an der Explosion gewesen}
  112.  
  113.     VAR help   : BYTE;
  114.         x0,y0,r: INTEGER;
  115.  
  116.     BEGIN
  117.       FOR help:=1 TO TBase^.player DO
  118.         IF TBase^.players[help].Ok THEN
  119.            WITH TBase^ DO
  120.              BEGIN
  121.                x0:=players[help].x-players[identify].x; { Satz des Phytagoras}
  122.                y0:=players[help].y-players[identify].y;
  123.                r:=x0*x0+y0*y0;
  124.                IF r<226 THEN MyExit(help);
  125.              END;
  126.     END;
  127.  
  128.   FUNCTION Pl_Vorne(EinSpieler : SpielerPtr) : BYTE; { Wer war im Weg ?}
  129.  
  130.     BEGIN
  131.       pl_Vorne:=readpixel(gameRP,einspieler^.x+einspieler^.mx,
  132.                                  einspieler^.y+einspieler^.my)-1;
  133.     END;
  134.  
  135.   PROCEDURE Explodiere; { ? - Sicherlich gibt es schönere Methoden. }
  136.                         { Diese ist dafür sehr schnell.             }
  137.  
  138.     VAR posx,posy,zahl : SHORT;
  139.  
  140.     BEGIN
  141.       WITH TBase^.players[identify] DO
  142.         BEGIN
  143.           SetAPen(GameRP,9);
  144.  
  145.           Move(GameRP,x-5,y  );
  146.           Draw(GameRP,x+5,y  );
  147.  
  148.           Move(GameRP,x  ,y-5);
  149.           Draw(GameRP,x  ,y+5);
  150.  
  151.  
  152.           Move(GameRP,x+2,y-3);
  153.           Draw(GameRP,x+2,y+3);
  154.  
  155.           Move(GameRP,x-2,y-3);
  156.           Draw(GameRP,x-2,y+3);
  157.  
  158.  
  159.           Move(GameRP,x+3,y+2);
  160.           Draw(GameRP,x-3,y+2);
  161.  
  162.           Move(GameRP,x+3,y-2);
  163.           Draw(GameRP,x-3,y-2);
  164.  
  165.           SetAPen(GameRP,identify+1);
  166.           FOR zahl:=1 TO 7 DO
  167.            BEGIN
  168.             REPEAT
  169.               posx:=RangeRandom(14)-7;
  170.               posy:=RangeRandom(14)-7;
  171.             UNTIL SQR(posx)+SQR(posy)<50;
  172.  
  173.             WritePixel(GameRP,x+posx,y+posy);
  174.            END;
  175.         END;
  176.     END;
  177.  
  178.   VAR hindernis : BYTE;
  179.                         { Was da so alles erledigt werden muß... }
  180.   BEGIN
  181.     IF TBase^.Remain>1 THEN
  182.      BEGIN
  183.        hindernis:=Pl_Vorne(ADR(TBase^.players[identify]));
  184.        TBase^.players[identify].ok:=FALSE;             { Spieler kaputt }
  185.        IF (hindernis<>identify) AND (hindernis>0) AND (hindernis<=maxplay) THEN
  186.           IF TBase^.players[hindernis].ok THEN
  187.              inc(TBase^.players[hindernis].hits);      { Eventuell Hits erhöhen }
  188.        IF hindernis=-1 THEN
  189.           BEGIN
  190.             TBase^.QuitGame:=TRUE;
  191.             TBase^.First:=identify;
  192.           END
  193.          ELSE BEGIN
  194.                 TBase^.remain:=TBase^.Remain-1;
  195.                 CASE TBase^.remain OF { Anzahl der Überlebenden }
  196.                   1 : BEGIN                     { = 1 }
  197.                         TBase^.Quitgame:=TRUE;  { =>Spiel zuende }
  198.                         TBase^.secnd:=Identify; { Zerstörter = 2.  }
  199.                         FOR hindernis:=1 TO TBase^.Player DO
  200.                           IF TBase^.players[hindernis].ok THEN
  201.                              TBase^.first:=hindernis; { Überlebender = 1. }
  202.                       END;
  203.                   2 : BEGIN                     { = 2 }
  204.                         TBase^.third:=Identify; { => Zerstörter = 3. }
  205.                         Reichweite;
  206.                       END;
  207.                  ELSE Reichweite; { Ansonsten Pech gehabt }
  208.                 END;
  209.  
  210.                 Explodiere;
  211.               END;
  212.      END;
  213.   END;
  214.  
  215. PROCEDURE Mauere(ID : BYTE); { Letzten Punkt löschen      }
  216.                              { und ersten Punkt speichern }
  217.  
  218.   BEGIN
  219.     IF TBase^.max_length>0 THEN
  220.        WITH TBase^ DO
  221.          WITH Players[ID] DO
  222.            BEGIN
  223.              With strich[pos] DO
  224.                IF ReadPixel(GameRP,x,y)=id+1 THEN
  225.                   IF x>0 THEN
  226.                      BEGIN
  227.                        SetAPen(GameRP,9);
  228.                        Writepixel(GameRP,x,y);
  229.                      END;
  230.  
  231.              strich[pos].x:=x;
  232.              strich[pos].y:=y;
  233.  
  234.              inc(pos);
  235.              IF pos>max_Length THEN pos:=1;
  236.            END;
  237.   END;
  238.  
  239. PROCEDURE Loesche_Striche;  { Die Striche kaputter Spieler löschen }
  240.  
  241.   VAR Hilfe : SHORT;
  242.  
  243.   BEGIN
  244.     With TBase^ DO
  245.       IF max_length>0 THEN
  246.          FOR hilfe:=1 TO player DO
  247.            IF NOT players[hilfe].ok THEN
  248.               WITH players[hilfe] DO
  249.                 BEGIN
  250.                   WITH Strich[pos] DO
  251.                     IF (ReadPixel(GameRP,x,y)=id+1) THEN
  252.                        BEGIN
  253.                          IF x>0 THEN
  254.                             BEGIN
  255.                               SetAPen(GameRP,9);
  256.                               Writepixel(GameRP,x,y);
  257.                             END;
  258.  
  259.                          Strich[pos].x:=0;
  260.                        END;
  261.  
  262.                   inc(pos);
  263.                   IF pos>max_Length THEN pos:=1;
  264.                 END;
  265.   END;
  266.  
  267. {======= Here it starts... ============}
  268.  
  269. FUNCTION vorne_frei(EinSpieler : SpielerPtr) : BOOLEAN; { gehts vor ? }
  270.  
  271.   VAR Farbe : INTEGER;
  272.  
  273.   BEGIN
  274.     Farbe:=readpixel(GameRP,einspieler^.x+einspieler^.mx,
  275.                             einspieler^.y+einspieler^.my);
  276.     Farbe:=Farbe MOD 16;
  277.     vorne_Frei:=(Farbe=9);
  278.   END;
  279.  
  280. FUNCTION rechts_frei(einspieler : SpielerPtr) : BOOLEAN; { rechts frei ? }
  281.  
  282.   VAR Farbe : INTEGER;
  283.  
  284.   BEGIN
  285.     Farbe:=readpixel(GameRP,einspieler^.x-einspieler^.my,
  286.                             einspieler^.y+einspieler^.mx);
  287.     Farbe:=Farbe MOD 16;
  288.     rechts_Frei:=(Farbe=9);
  289.   END;
  290.  
  291. FUNCTION links_frei(einspieler : SpielerPtr) : BOOLEAN; { links frei ? }
  292.  
  293.   VAR Farbe : INTEGER;
  294.  
  295.   BEGIN
  296.     Farbe:=ReadPixel(GameRP,einspieler^.x+einspieler^.my,
  297.                             einspieler^.y-einspieler^.mx);
  298.     Farbe:=Farbe MOD 16;
  299.     links_Frei:=(Farbe=9);
  300.   END;
  301.  
  302. FUNCTION Vorne_Links_frei(Einspieler : SpielerPtr) : BOOLEAN;
  303.  
  304.   VAR Farbe : INTEGER;
  305.  
  306.   BEGIN
  307.     WITH Einspieler^ DO
  308.       Farbe:=ReadPixel(GameRP,x+mx+my,y+my-mx);
  309.  
  310.     Farbe:=Farbe MOD 16;
  311.     Vorne_Links_Frei:=(Farbe=9);
  312.   END;
  313.  
  314. FUNCTION Vorne_Rechts_frei(Einspieler : SpielerPtr) : BOOLEAN;
  315.  
  316.   VAR Farbe : INTEGER;
  317.  
  318.   BEGIN
  319.     WITH Einspieler^ DO
  320.       Farbe:=ReadPixel(GameRP,x+mx-my,y+my+mx);
  321.  
  322.     Farbe:=Farbe MOD 16;
  323.     Vorne_Rechts_Frei:=(Farbe=9);
  324.   END;
  325.  
  326. PROCEDURE drehe_links(einspieler : SpielerPtr); { drehen }
  327.  
  328.   VAR hilfe : SHORT;
  329.  
  330.   BEGIN
  331.     inc(einspieler^.left);
  332.  
  333.     hilfe:=-einspieler^.mx;
  334.     einspieler^.mx:=einspieler^.my;
  335.     einspieler^.my:=hilfe;
  336.   END;
  337.  
  338. PROCEDURE drehe_rechts(einspieler : SpielerPtr); { andersrum drehen }
  339.  
  340.   VAR hilfe : SHORT;
  341.  
  342.   BEGIN
  343.     einspieler^.left:=Einspieler^.left-1;
  344.  
  345.     hilfe:=einspieler^.mx;
  346.     einspieler^.mx:=-einspieler^.my;
  347.     einspieler^.my:=hilfe;
  348.   END;
  349.  
  350. PROCEDURE Vor(aspieler : SpielerPtr); { VORWÄRTS }
  351.  
  352.   BEGIN
  353.     IF NOT vorne_frei(aSpieler) THEN MyExit(aspieler^.ID)
  354.        ELSE With ASpieler^ DO
  355.             BEGIN
  356.               mauere(ID);
  357.  
  358.               SetAPen(GameRP,ID+1);
  359.  
  360.               x:=x+mx;
  361.               y:=y+my;
  362.  
  363.               WritePixel(GameRP,x,y);
  364.             END;
  365.   END;
  366.  
  367. {======= Here it ends... ============}
  368.  
  369. PROCEDURE Male_Stein;   { Hindernisse malen... }
  370.  
  371.   VAR x,y,color : SHORT;
  372.  
  373.   BEGIN
  374.     x    :=RangeRandom(295)+11; { Position und Art auswürfeln }
  375.     y    :=RangeRandom(220)+11;
  376.     color:=RangeRandom(  2)+10;
  377.  
  378.     CASE RangeRandom(17) OF
  379.       0,
  380.       1,
  381.       2,
  382.       3,
  383.       4,
  384.       5 : BEGIN
  385.             SetAPen(GameRP,10);
  386.             Move(GameRP,x  ,y+3);
  387.             Draw(GameRP,x+3,y+3);
  388.             Draw(GameRP,x+3,y  );
  389.  
  390.             SetAPen(GameRP,12);
  391.             Draw(GameRP,x  ,y  );
  392.             Draw(GameRP,x  ,y+3);
  393.  
  394.             SetAPen(GameRP,11);
  395.             RectFill(GameRP,x+1,y+1,x+2,y+2);
  396.           END;
  397.       6,
  398.       7,
  399.       8,
  400.       9 : BEGIN
  401.             SetAPen(GameRP,color);
  402.             Move(GameRP,x  ,y+3);
  403.             Draw(GameRP,x+3,y+3);
  404.             Draw(GameRP,x+3,y  );
  405.             Draw(GameRP,x  ,y  );
  406.             Draw(GameRP,x  ,y+3);
  407.           END;
  408.      10,
  409.      11 : BEGIN
  410.             IF x=306 THEN x:=305;
  411.             IF y=231 THEN y:=230;
  412.  
  413.             SetAPen(GameRP,color);
  414.             DrawCircle(GameRP,x+2,y+2,2);
  415.           END;
  416.      12,
  417.      13 : BEGIN
  418.             SetAPen(GameRP,color);
  419.             RectFill(GameRP,x,y,x+3,y+3);
  420.           END;
  421.      14 : BEGIN
  422.             IF color=12 THEN color:=11;
  423.             IF x=306 THEN x:=305;
  424.             IF y=231 THEN y:=230;
  425.  
  426.             SetAPen(GameRP,color+1);
  427.             Move(GameRP,x+1,y+4);
  428.             Draw(GameRP,x+4,y+4);
  429.             Draw(GameRP,x+4,y+1);
  430.             Draw(GameRP,x+1,y+1);
  431.             Draw(GameRP,x+1,y+4);
  432.  
  433.             SetAPen(GameRP,color);
  434.             Move(GameRP,x  ,y+3);
  435.             Draw(GameRP,x+3,y+3);
  436.             Draw(GameRP,x+3,y  );
  437.             Draw(GameRP,x  ,y  );
  438.             Draw(GameRP,x  ,y+3);
  439.           END;
  440.      15 : BEGIN
  441.             IF color=10 THEN color:=11;
  442.             IF x=306 THEN x:=305;
  443.             IF y=231 THEN y:=230;
  444.  
  445.             SetAPen(GameRP,color-1);
  446.             Move(GameRP,x+1,y+4);
  447.             Draw(GameRP,x+4,y+4);
  448.             Draw(GameRP,x+4,y+1);
  449.             Draw(GameRP,x+1,y+1);
  450.             Draw(GameRP,x+1,y+4);
  451.  
  452.             SetAPen(GameRP,color);
  453.             Move(GameRP,x  ,y+3);
  454.             Draw(GameRP,x+3,y+3);
  455.             Draw(GameRP,x+3,y  );
  456.             Draw(GameRP,x  ,y  );
  457.             Draw(GameRP,x  ,y+3);
  458.           END;
  459.      ELSE BEGIN
  460.             IF x=306 THEN x:=305;
  461.             IF y=231 THEN y:=230;
  462.  
  463.             SetAPen(GameRP,color);
  464.             DrawCircle(GameRP,x+2,y+2,2);
  465.             IF color<12 THEN SetAPen(GameRP,color+1)
  466.                         ELSE SetAPen(GameRP,12 );
  467.             RectFill(GameRP,x+1,y+1,x+3,y+3);
  468.           END;
  469.     END;
  470.   END;
  471.  
  472. PROCEDURE DrawGameField; { Erst Spielfeld malen }
  473.  
  474.   PROCEDURE Loesche_Startzone;
  475.  
  476.     VAR zahl,MinX,MinY,MaxX,MaxY : SHORT;
  477.  
  478.     BEGIN
  479.       MinX:=640;
  480.       MinY:=256;
  481.       MaxX:=0;
  482.       MaxY:=0;
  483.  
  484.       FOR zahl:=1 TO TBase^.Player DO
  485.         WITH TBase^.Players[zahl] DO
  486.         BEGIN
  487.           IF MinX>x THEN MinX:=x;
  488.           IF MinY>y THEN MinY:=y;
  489.           IF MaxX<x THEN MaxX:=x;
  490.           IF MaxY<y THEN MaxY:=y;
  491.         END;
  492.  
  493.       SetAPen(GameRP,9);
  494.       Rectfill(GameRP,MinX,MinY,MaxX,MaxY);
  495.     END;
  496.  
  497.   VAR hilfe : SHORT;
  498.  
  499.   BEGIN
  500.     SetAPen(GameRP,0);
  501.     RectFill(GameRP,0,0,319,245);
  502.  
  503.     SetAPen(GameRP,1);
  504.     Line(GameRP,0,0,319,0);
  505.  
  506.     SetAPen(GameRP,9);
  507.     RectFill(GameRP,10,10,310,235);
  508.     DrawCBox(GameRP,10,10,310,235,10,1);
  509.  
  510.     SetAPen(GameRP,10);
  511.  
  512.     WritePixel(GameRP,11,130);
  513.  
  514.     WritePixel(GameRP,177,11);
  515.  
  516.     SetAPen(GameRP,1);
  517.  
  518.     WritePixel(GameRP,125,234);
  519.  
  520.     WritePixel(GameRP,309,90);
  521.  
  522.     FOR Hilfe:=1 TO LevelArray[TBase^.level] DO { Hindernisse malen }
  523.       BEGIN
  524.         Male_Stein;
  525.       END;
  526.  
  527.     { Grundstriche malen }
  528.     IF TBase^.Use_Maze THEN
  529.        BEGIN
  530.          WITH TBase^.MyMaze DO
  531.            FOR Hilfe:=1 TO LineNum DO
  532.              WITH linien^[Hilfe] DO
  533.                BEGIN
  534.                  SetAPen(GameRP,colour);
  535.                  Move(GameRP,x1,y1);
  536.                  Draw(GameRP,x2,y2);
  537.                END;
  538.        END
  539.       ELSE
  540.        BEGIN
  541.          SetAPen(GameRP,RangeRandom(2)+10);
  542.  
  543.          Move(GameRP,50, 60);
  544.          Draw(GameRP,50,180);
  545.  
  546.          Move(GameRP,270, 60);
  547.          Draw(GameRP,270,180);
  548.        END;
  549.  
  550.     IF NOT TBase^.Use_Maze OR TBase^.MyMaze.Loeschen THEN
  551.        Loesche_Startzone;
  552.  
  553.     FOR Hilfe:=1 TO MaxPlay DO BEGIN { Anfangspositionen malen }
  554.                                  IF TBase^.players[Hilfe].ok THEN
  555.                                     BEGIN
  556.                                       SetAPen(GameRP,
  557.                                             TBase^.Players[Hilfe].ID+1);
  558.                                       WritePixel(GameRP,
  559.                                                TBase^.Players[Hilfe].x,
  560.                                                TBase^.Players[Hilfe].y);
  561.                                     END;
  562.                                END;
  563.   END;
  564.  
  565.   PROCEDURE Lobe; { ? }
  566.  
  567.     VAR Punkte : BYTE;
  568.  
  569.     PROCEDURE Verteile_Punkte; { ? }
  570.  
  571.       VAR help1,lebende : BYTE;
  572.  
  573.       BEGIN
  574.         FOR help1:=1 TO TBase^.player DO WITH TBase^.players[help1] DO
  575.             score:=score+3*hits; { 3 Pts für jeden aktiv zerstörten Gegner }
  576.  
  577.         IF TBase^.remain=1 THEN
  578.            BEGIN
  579.              WITH TBase^.players[TBase^.first] DO { 1. = 15 Pts }
  580.                Score:=Score+15;
  581.              WITH TBase^.players[TBase^.secnd] DO { 2. = 10 Pts }
  582.                Score:=Score+10;
  583.              WITH TBase^.players[TBase^.third] DO { 3. =  5 Pts }
  584.                Score:=Score+5;
  585.            END
  586.         ELSE IF TBase^.first>0 THEN
  587.                 BEGIN
  588.                   WITH TBase^.players[TBase^.first] DO
  589.                     score:=score+20;{ Entkommen = 20 Pts}
  590.                 END
  591.                ELSE
  592.                 BEGIN
  593.                   Lebende:=0;
  594.                   FOR Help1:=1 TO TBase^.Player DO
  595.                     IF TBase^.Players[help1].Ok THEN inc(lebende);
  596.  
  597.                   CASE Lebende OF
  598.                     2 : BEGIN
  599.                           Punkte:=12;
  600.                           WITH TBase^.Players[TBase^.third] DO
  601.                             Score:=score+5;
  602.                         END;
  603.                     3 : Punkte:=10;
  604.                     4 : Punkte:= 8;
  605.                     5 : Punkte:= 6;
  606.                     6 : Punkte:= 5;
  607.                   END;
  608.  
  609.                   FOR Help1:=1 TO TBase^.Player DO
  610.                     WITH TBase^.Players[Help1] DO
  611.                       BEGIN
  612.                         IF Ok THEN Score:=Score+Punkte;
  613.                       END;
  614.                 END;
  615.       END;
  616.  
  617.     VAR sHelp,kills : SHORT;
  618.         sString     : STRING;
  619.  
  620.     BEGIN                       { und alles auf dem Bildschirm ausgeben }
  621.       sString:=ALLOCSTRING(40);
  622.       Verteile_Punkte;
  623.       IF TBase^.remain=1 THEN { wenn keiner entkommen ist... }
  624.          BEGIN
  625.            SetAPen(GameRP,8);
  626.            RectFill(GameRP,74,28,245,38);
  627.            DrawSBox(GameRP,74,28,245,38);
  628.            IF Sprache=Deutsch THEN StrCpy(sString,"Sieger : ")
  629.                               ELSE StrCpy(sString,"Winner : ");
  630.            StrCat(sString,TBase^.players[TBase^.First].name);
  631.            Print(GameRP,160-(LENGTH(sString) DIV 2),36,sString,TBase^.first+1);
  632.  
  633.            SetAPen(GameRP,8);
  634.            RectFill(GameRP,74,48,245,58);
  635.            DrawSBox(GameRP,74,48,245,58);
  636.            IF Sprache=Deutsch THEN StrCpy(sString,"Zweiter : ")
  637.                               ELSE StrCpy(sString,"Second : ");
  638.            StrCat(sString,TBase^.players[TBase^.Secnd].name);
  639.            Print(GameRP,160-(LENGTH(sString) DIV 2),56,sString,TBase^.secnd+1);
  640.  
  641.            If TBase^.Player>2 THEN
  642.               BEGIN
  643.                 SetAPen(GameRP,8);
  644.                 RectFill(GameRP,74,68,245,78);
  645.                 DrawSBox(GameRP,74,68,245,78);
  646.  
  647.                 IF Sprache=Deutsch THEN StrCpy(sString,"Dritter : ")
  648.                                    ELSE StrCpy(sString,"Third : "  );
  649.                 StrCat(sString,TBase^.players[TBase^.third].name);
  650.                 Print(GameRP,160 -(LENGTH(sString) DIV 2),76,sString,TBase^.Third+1);
  651.               END;
  652.          END
  653.         ELSE IF TBase^.First=0 THEN
  654.                 BEGIN
  655.                   SetAPen(GameRP,8);
  656.                   RectFill(GameRP,74,28,245,38);
  657.                   DrawSBox(GameRP,74,28,245,38);
  658.                   IF Sprache=Deutsch THEN StrCpy(sString,"Überlebensbonus : ")
  659.                                      ELSE StrCpy(sString,"Survival bonus : " );
  660.                   AddString(sString,punkte);
  661.                   Print(GameRP,160-(LENGTH(sString) DIV 2),36,sString,12);
  662.  
  663.                   IF TBase^.Third>0 THEN
  664.                      BEGIN
  665.                        SetAPen(GameRP,8);
  666.                        RectFill(GameRP,74,68,245,78);
  667.                        DrawSBox(GameRP,74,68,245,78);
  668.  
  669.                        IF Sprache=Deutsch THEN StrCpy(sString,"Dritter : ")
  670.                                           ELSE StrCpy(sString,"Third : "  );
  671.                        StrCat(sString,TBase^.players[TBase^.third].name);
  672.                        Print(GameRP,160 -(LENGTH(sString) DIV 2),76,sString,TBase^.Third+1);
  673.                      END;
  674.                 END;
  675.  
  676.       kills:=0;                   { Erledigte zählen }
  677.       FOR SHelp:=1 TO MaxPlay DO
  678.         BEGIN
  679.           Kills:=kills+TBase^.players[sHelp].hits;
  680.         END;
  681.  
  682.       IF Kills>0 THEN { Nur anzeigen, wenn mindestens einer erwischt wurde }
  683.          BEGIN
  684.            SetAPen(GameRP,8);
  685.            RectFill(GameRP,78,90,242,210);
  686.            DrawSBox(GameRP,78,90,242,210);
  687.            IF Sprache=Deutsch THEN Print(GameRP,133,106,"Erledigt",1)
  688.                               ELSE Print(GameRP,139,106,"Killed"  ,1);
  689.  
  690.            FOR sHelp:=1 TO maxplay DO
  691.              BEGIN
  692.                 StrCpy(sString,TBase^.players[sHelp].name);
  693.                 Print(GameRP,88,106+15*shelp,sString,sHelp+1);
  694.  
  695.                 StrCpy(sString,":  ");
  696.                  AddString(sString,TBase^.players[shelp].hits);
  697.                 Print(GameRP,204,106+15*shelp,sString,sHelp+1);
  698.              END;
  699.          END;
  700.  
  701.       FreeString(sString);
  702.     END;
  703.  
  704. PROCEDURE CalcPlayer(einSpieler : SpielerPtr); { Computerspieler berechen }
  705.  
  706.   FUNCTION V_L_frei : BOOLEAN;
  707.  
  708.     VAR Farbe : INTEGER;
  709.  
  710.     BEGIN
  711.       Farbe:=ReadPixel(GameRP,einspieler^.x+einspieler^.mx+einspieler^.my,
  712.                               einspieler^.y+einspieler^.my-einspieler^.mx);
  713.  
  714.       Farbe:=Farbe MOD 16;
  715.       V_L_Frei:=((Farbe=9) OR (Farbe=0));
  716.     END;
  717.  
  718.   FUNCTION V_R_frei : BOOLEAN;
  719.  
  720.     VAR Farbe : INTEGER;
  721.  
  722.     BEGIN
  723.       Farbe:=ReadPixel(GameRP,einspieler^.x+einspieler^.mx-einspieler^.my,
  724.                               einspieler^.y+einspieler^.my+einspieler^.mx);
  725.  
  726.       Farbe:=Farbe MOD 16;
  727.       V_R_Frei:=((Farbe=9) OR (Farbe=0));
  728.     END;
  729.  
  730.   FUNCTION v_frei : BOOLEAN; { gehts vor ? }
  731.  
  732.     VAR Help : BYTE;
  733.  
  734.     BEGIN
  735.       Help:=readpixel(GameRP,einspieler^.x+einspieler^.mx,
  736.                              einspieler^.y+einspieler^.my);
  737.       V_Frei:=((Help=9) OR (Help=0));
  738.     END;
  739.  
  740.   FUNCTION r_frei : BOOLEAN; { rechts frei ? }
  741.  
  742.     VAR Help : BYTE;
  743.  
  744.     BEGIN
  745.       Help:=readpixel(GameRP,einspieler^.x-einspieler^.my,
  746.                              einspieler^.y+einspieler^.mx);
  747.       r_Frei:=((Help=9) OR (Help=0));
  748.     END;
  749.  
  750.   FUNCTION l_frei : BOOLEAN; { links frei ? }
  751.  
  752.     VAR Help : BYTE;
  753.  
  754.     BEGIN
  755.       help:=readpixel(GameRP,einspieler^.x+einspieler^.my,
  756.                              einspieler^.y-einspieler^.mx);
  757.       l_Frei:=((Help=9) OR (help=0));
  758.     END;
  759.  
  760.   PROCEDURE ComputerSchema_1a; { Für KI=0 }
  761.  
  762.     VAR mx,my : SHORT;
  763.  
  764.     BEGIN
  765.       mx:=Einspieler^.mx;
  766.       my:=Einspieler^.my;
  767.  
  768.      IF mx= 1 THEN
  769.         BEGIN
  770.           IF einspieler^.y<128 THEN Drehe_rechts(Einspieler)
  771.                                ELSE Drehe_links (Einspieler);
  772.         END
  773.        ELSE
  774.         BEGIN
  775.           IF mx=-1 THEN
  776.              BEGIN
  777.                IF einspieler^.y<128 THEN Drehe_links (Einspieler)
  778.                                     ELSE Drehe_rechts(Einspieler);
  779.              END
  780.             ELSE
  781.              BEGIN
  782.                IF my= 1 THEN
  783.                   BEGIN
  784.                     IF einspieler^.x<160 THEN Drehe_links (Einspieler)
  785.                                          ELSE Drehe_rechts(Einspieler);
  786.                   END
  787.                  ELSE
  788.                   IF my=-1 THEN
  789.                      BEGIN
  790.                         IF einspieler^.x<160 THEN Drehe_rechts(Einspieler)
  791.                                              ELSE Drehe_links (Einspieler);
  792.                      END;
  793.              END;
  794.         END;
  795.     END;
  796.  
  797.   PROCEDURE ComputerSchema_1b; { Für KI=1 }
  798.  
  799.     VAR mx,my : SHORT;
  800.  
  801.     BEGIN
  802.       mx:=Einspieler^.mx;
  803.       my:=Einspieler^.my;
  804.  
  805.      IF mx= 1 THEN
  806.         BEGIN
  807.           IF einspieler^.y<128 THEN Drehe_rechts(Einspieler)
  808.                                ELSE Drehe_links (Einspieler);
  809.         END
  810.        ELSE
  811.         BEGIN
  812.           IF mx=-1 THEN
  813.              BEGIN
  814.                IF einspieler^.y<128 THEN Drehe_links (Einspieler)
  815.                                     ELSE Drehe_rechts(Einspieler);
  816.              END
  817.             ELSE
  818.              BEGIN
  819.                IF my= 1 THEN
  820.                   BEGIN
  821.                     IF einspieler^.x<160 THEN Drehe_links (Einspieler)
  822.                                          ELSE Drehe_rechts(Einspieler);
  823.                   END
  824.                  ELSE
  825.                   IF my=-1 THEN
  826.                      BEGIN
  827.                         IF einspieler^.x<160 THEN Drehe_rechts(Einspieler)
  828.                                              ELSE Drehe_links (Einspieler);
  829.                      END;
  830.              END;
  831.         END;
  832.     END;
  833.  
  834.   PROCEDURE ComputerSchema_2a; { für KI=2 }
  835.  
  836.     BEGIN
  837.       IF einspieler^.left>0 THEN drehe_rechts(Einspieler)
  838.                             ELSE drehe_links (Einspieler);
  839.     END;
  840.  
  841.   PROCEDURE ComputerSchema_2b; { für KI=3 }
  842.  
  843.     BEGIN
  844.       IF einspieler^.left>0 THEN BEGIN
  845.                                    drehe_rechts(Einspieler);
  846.                                    einspieler^.left:=0;
  847.                                  END
  848.                             ELSE BEGIN
  849.                                    drehe_links(Einspieler);
  850.                                    einspieler^.left:=1;
  851.                                  END;
  852.     END;
  853.  
  854.   VAR vorne,links,rechts : BOOLEAN;
  855.  
  856.   BEGIN
  857.     IF Einspieler^.Turbo THEN
  858.        IF v_Frei THEN
  859.           IF NOT (V_L_Frei AND V_R_Frei) THEN Vor(Einspieler);
  860.  
  861.     vorne:=v_Frei;
  862.     links:=l_frei;
  863.     rechts:=r_Frei;
  864.  
  865.     IF NOT Vorne THEN
  866.        BEGIN
  867.          IF Links AND Rechts THEN CASE Einspieler^.KI OF
  868.                                     0 : ComputerSchema_1a;
  869.                                     1 : ComputerSchema_1b;
  870.                                     2 : ComputerSchema_2a;
  871.                                     3 : ComputerSchema_2b;
  872.                                   END
  873.                              ELSE BEGIN
  874.                                     IF Links  THEN Drehe_Links (Einspieler);
  875.                                     IF rechts THEN Drehe_Rechts(Einspieler);
  876.                                   END;
  877.        END
  878.       ELSE IF Einspieler^.Ausweicher THEN
  879.               IF NOT (V_R_Frei OR V_L_Frei) THEN
  880.                  BEGIN
  881.                    IF links  THEN Drehe_Links (Einspieler);
  882.                    IF rechts THEN Drehe_Rechts(Einspieler);
  883.                  END;
  884.   END;
  885.  
  886. PROCEDURE OpenGameDisplay;
  887.  
  888.   PROCEDURE SetGameColours; { Farben einstellen }
  889.  
  890.     VAR MyColours, Colours : ColourArray;
  891.         Hilfe,help : BYTE;
  892.  
  893.     BEGIN
  894.       FOR hilfe:=0 TO 19 DO SetRGB4(ADDRESS(GameScreen^.SViewPort),hilfe,
  895.                                             NormColours[hilfe].r,
  896.                                             NormColours[hilfe].g,
  897.                                             NormColours[hilfe].b);
  898.  
  899.       WITH TBase^ DO
  900.         SetRGB4(ADR(GameScreen^.SViewPort),9,
  901.                     BackColours[BackColour].r,
  902.                     BackColours[BackColour].g,
  903.                     BackColours[BackColour].b);
  904.     END;
  905.  
  906.   CONST gNewWindow  : NewWindow = (0,10,320,246,0,0,RawKey_F+MouseButtons_F,
  907.                                    SMART_Refresh+RMBTrap+BORDERLESS,NIL,
  908.                                    NIL,NIL,NIL,NIL,320,226,320,226,
  909.                                    CUSTOMSCREEN_F);
  910.  
  911.         gNewScreen  : NewScreen = (0,0,320,256,4,8,1,0,CUSTOMSCREEN_F+
  912.                                    ScreenBehind_F,NIL,
  913.                                    "LS-Tron - Spielfeldbildschirm",
  914.                                    NIL,NIL);
  915.  
  916.   BEGIN
  917.     gamescreen:=NIL;
  918.     GameWindow:=NIL;
  919.  
  920.     GNewScreen.font:=ADR(NFont);
  921.     GameScreen:=OpenScreen(ADR(gNewScreen));
  922.     IF GameScreen=NIL THEN CleanExit(Error_No_Screen);
  923.  
  924.     gNewWindow.screen:=gameScreen;
  925.     GameWindow:=OpenWindow(ADR(gNewWindow));
  926.     IF gameWindow=NIL THEN CleanExit(Error_No_Window);
  927.  
  928.     GameRP:=ADDRESS(GameWindow^.RPort);
  929.     SetBPen(GameRP,8);
  930.  
  931.     SetGameColours;
  932.     DelMouse(GameWindow);
  933.  
  934.     ActivateWindow(GameWindow);
  935.     ScreenToFront(GameScreen);
  936.   END;
  937.  
  938. PROCEDURE CloseGameDisplay;
  939.  
  940.   BEGIN
  941.     ActivateWindow(MyWindow);
  942.     ScreenToFront(MyScreen);
  943.  
  944.     ClearPointer(GameWindow);
  945.  
  946.     CloseWindow(GameWindow);
  947.     CloseScreen(GameScreen);
  948.  
  949.     GameWindow:=NIL;
  950.     GameScreen:=NIL;
  951.     GameRP    :=NIL;
  952.   END;
  953.  
  954. PROCEDURE Play; { Endlich spielen }
  955.  
  956.   VAR PlNumber,
  957.       Bremser  : BYTE;
  958.  
  959.   PROCEDURE Reagiere_auf_MSGs;
  960.  
  961.     VAR aIntMSG : IntuiMessagePtr;
  962.  
  963.     PROCEDURE DecodeMSG; { Was will der User denn? }
  964.  
  965.       PROCEDURE Pause; { ??? }
  966.  
  967.         VAR sMSG : IntuiMessagePtr;
  968.  
  969.         BEGIN
  970.           sMSG:=NIL;
  971.           REPEAT
  972.             IF sMSG<>NIL THEN ReplyMsg(ADDRESS(sMSG));
  973.             sMSG:=NIL;
  974.             SMSG:=ADDRESS(WaitPort(Gamewindow^.UserPort));
  975.             sMSG:=ADDRESS(GetMSG(GameWindow^.UserPort));
  976.           UNTIL (sMsg^.Code=$19) AND (sMSG^.Class=RawKey_F);
  977.           ReplyMSG(ADDRESS(sMSG));
  978.         END;
  979.  
  980.       VAR Hilfe, code : SHORT;
  981.  
  982.       BEGIN
  983.         IF aIntMSG^.Class=RawKey_F THEN
  984.           WITH TBase^ DO
  985.             BEGIN
  986.               Code:=aIntMSG^.Code;
  987.  
  988.               IF Code=F1  THEN Bremser:=0;     {   F1    }
  989.               IF Code=$19 THEN Pause;          {   "P"   }
  990.               IF Code=$45 THEN QuitGame:=TRUE; { Escape? }
  991.               IF Code=F10 THEN BEGIN           {   F10   }
  992.                                  Unentschieden:=TRUE;
  993.                                  Quitgame:=TRUE;
  994.                                END;
  995.  
  996.               FOR Hilfe:=1 TO human DO
  997.                 IF players[hilfe].Steuerung=Tasten THEN
  998.                    WITH players[hilfe].plControl DO
  999.                      BEGIN
  1000.                        IF Code=links  THEN
  1001.                           drehe_links (ADR(players[hilfe]));
  1002.  
  1003.                        IF Code=rechts THEN
  1004.                           drehe_rechts(ADR(players[hilfe]));
  1005.  
  1006.                        IF Code=vorne  THEN
  1007.                           IF TBase^.players[hilfe].Ok THEN
  1008.                              vor         (ADR(players[hilfe]));
  1009.                      END;
  1010.             END;
  1011.       END;
  1012.  
  1013.     PROCEDURE CalcJoy; { Joysticksteuerung...}
  1014.                        { Die Variablen lastleft und lastright verhindern }
  1015.                        { doppelte Reaktion auf eine Joystickbewegung     }
  1016.  
  1017.       VAR Eingabe,hilfe : BYTE;
  1018.  
  1019.       BEGIN
  1020.         WITH TBase^ DO
  1021.           BEGIN
  1022.             FOR hilfe:=1 TO Human DO
  1023.               WITH players[hilfe] DO
  1024.                 BEGIN
  1025.                   IF Steuerung=Joy1 THEN
  1026.                      IF ok AND NOT complayer THEN
  1027.                         BEGIN
  1028.                           Eingabe:=Joystick1;
  1029.  
  1030.                           IF bittest(Eingabe,2) THEN
  1031.                              BEGIN
  1032.                                IF NOT lastleft THEN
  1033.                                   drehe_links (ADR(players[hilfe]));
  1034.                                lastleft:=TRUE;
  1035.                              END
  1036.                             ELSE lastleft:=FALSE;
  1037.  
  1038.                           IF bittest(Eingabe,3) THEN
  1039.                              BEGIN
  1040.                                IF NOT lastright THEN
  1041.                                   drehe_rechts(ADR(players[hilfe]));
  1042.                                lastright:=TRUE;
  1043.                              END
  1044.                             ELSE lastright:=FALSE;
  1045.  
  1046.                           IF bittest(Eingabe,4) THEN vor(ADR(players[hilfe]));
  1047.                         END;
  1048.  
  1049.                   IF Steuerung=Joy2 THEN
  1050.                      IF ok AND NOT complayer THEN
  1051.                         BEGIN
  1052.                           Eingabe:=Joystick2;
  1053.  
  1054.                           IF bittest(Eingabe,2) THEN
  1055.                              BEGIN
  1056.                                IF NOT lastleft THEN
  1057.                                   drehe_links (ADR(players[hilfe]));
  1058.                                lastleft:=TRUE;
  1059.                              END
  1060.                             ELSE lastleft:=FALSE;
  1061.  
  1062.                           IF bittest(Eingabe,3) THEN
  1063.                              BEGIN
  1064.                                IF NOT lastright THEN
  1065.                                   drehe_rechts(ADR(players[hilfe]));
  1066.                                lastright:=TRUE;
  1067.                              END
  1068.                             ELSE lastright:=FALSE;
  1069.  
  1070.                           IF bittest(Eingabe,4) THEN vor(ADR(players[hilfe]));
  1071.                         END;
  1072.                 END;
  1073.           END;
  1074.       END;
  1075.  
  1076.     BEGIN
  1077.       REPEAT
  1078.         aIntMSG:=NIL;
  1079.         aIntMSG:=ADDRESS(GetMSG(GameWindow^.UserPort));
  1080.         IF aIntMSG<>NIL THEN BEGIN { Der User (schon wieder?)}
  1081.                                DecodeMSG;
  1082.                                ReplyMSG(ADDRESS(aIntMSG));
  1083.                               END;
  1084.       UNTIL aIntMSG=NIL; { bis User fertig }
  1085.       CalcJoy;
  1086.     END;
  1087.  
  1088.   BEGIN
  1089.     OpenGameDisplay;
  1090.  
  1091.     DrawGameField;
  1092.  
  1093.     Bremser:=SpeedArray[TBase^.Speed];
  1094.  
  1095.     TBase^.QuitGame:=FALSE; { Noch nicht beenden }
  1096.     TBase^.Unentschieden:=FALSE;
  1097.  
  1098.     WITH TBase^ DO
  1099.       REPEAT
  1100.         Reagiere_auf_MSGs;
  1101.  
  1102.         FOR plNumber:=1 TO player DO
  1103.             BEGIN
  1104.               IF players[plnumber].comPlayer AND
  1105.                  players[PlNumber].ok THEN { Computer berechnen und vorwärts }
  1106.                    CalcPlayer(ADR(players[PLNumber]));
  1107.               IF players[plNumber].ok THEN
  1108.                  vor(ADR(players[PLNumber]));
  1109.             END;
  1110.  
  1111.         Loesche_Striche;
  1112.         IF level=5 THEN Male_Stein;
  1113.  
  1114.         Delay(Bremser); { Warten }
  1115.  
  1116.         Bremsen(player-remain);
  1117.  
  1118.       UNTIL QuitGame; { bis Spiel zuende }
  1119.  
  1120.     IF (TBase^.first>0      ) OR
  1121.        (TBase^.Unentschieden) THEN Lobe;{ Sieger ausgeben }
  1122.  
  1123.     ViewMouse(gameWindow);
  1124.     ViewMouse(MyWindow);
  1125.  
  1126.     IF (TBase^.first >0) AND
  1127.        (TBase^.first <7) AND
  1128.        (TBase^.remain>1) THEN WaitEsc(TBase^.first)
  1129.                          ELSE Warte;
  1130.  
  1131.     CloseGameDisplay;
  1132.   END;
  1133.  
  1134. { Play Ende ===============================================================}
  1135.